package controlador;

import java.awt.Color;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Date;
import java.util.Random;
import java.util.Vector;

import javax.swing.JButton;
import javax.swing.JOptionPane;
import javax.swing.JPanel;

import modelo.dao.PartidaRecordDAO;
import modelo.dto.PartidaRecord;

import vista.JPartida;


public class ControladorPartida implements ActionListener {
	
	private JPartida ventanaPartida;
	private boolean ganador;
	private boolean fin;
	private int intentos   = 0;
	private int puntosGanados;
	private int x,tiempo;
	private Double minutos;
	private String nivel;
	private String nivel1;
	private String jugador;
	private String nivelBoton;
	private Vector<Integer> vectorSecreto;
	Vector<Integer> vectorDB = new Vector<Integer> (3);
	Vector<Integer> vectorDI = new Vector<Integer> (4);
	Vector<Integer> vectorDA = new Vector<Integer> (5);
	int ArrayBasico[] = new int[4];
	int ArrayIntermedio[] = new int[5];
	int ArrayAvanzado[] = new int[6];
	Vector<Integer> codigoSolucion = new Vector<Integer>(7);
	Vector<Integer> codigoDado = new Vector<Integer>(7);
	int i=0;
	int coincidencias=0;
	int h;
	private int blancas=0;
	private int negras=0;
	private int altura					=155;
	private int alturaTipo				;
	private int anchoTipo				;
	private int jugadas					= 0;
	private int cantidad				= 0;
	private JPanel pnlImagenPartida;
	private final int NIVEL_BASICO		= 4;
	private final int NIVEL_INTERMEDIO	= 5;
	private final int NIVEL_AVANZADO	= 6;
	
	public ControladorPartida(){
		this.ventanaPartida = new JPartida();
		this.ventanaPartida.setVisible(true);
		
		pnlImagenPartida = (JPanel) ventanaPartida.getContentPane();
		pnlImagenPartida.setLayout(null);
		
		ventanaPartida.PedirJugador();
		ventanaPartida.PedirNivel();
		nivel   = ventanaPartida.getLblDescripcionNivel().getText();
		jugador = ventanaPartida.getLblNombreJugador().getText();
		vectorSecreto = GenerarCodigoSecreto();
		for (int y = 0; y < 4; y++)
			 ArrayBasico[y] = -1;
			for (int t = 0; t < 5; t++)
				 ArrayIntermedio[t] = -1;
			for (int q = 0; q < 6; q++)
				 ArrayAvanzado[q] = -1;
		this.ventanaPartida.AddListener(nivel, this);
		codigoSolucion = GenerarCodigoSecreto();
	}

	public void actionPerformed(ActionEvent e) {
		
		if(nivel.equals("Basico")){
			
			 for (int i = 0; i < 12; i++)
				 	for (int j = 0; j<4; j++)
					{
					   if((e.getActionCommand().equals((ventanaPartida.getPnlBasico().getButton(i,j).getActionCommand())))){
					 		ventanaPartida.getPnlBasico().getButton(i,j).setBackground(ventanaPartida.getBotonera().pasala());
					 		 x = ventanaPartida.getBotonera().numero();
					 	     ArrayBasico[j] = x; 
					   } 
					}
		}
		else if(nivel.equals("Intermedio")){
			 for (int i = 0; i < 13; i++)
			 	for (int j = 0; j<5; j++)
				{
				   if((e.getActionCommand().equals((ventanaPartida.getPnlIntermedio().getButton(i,j).getActionCommand())))){
				 		ventanaPartida.getPnlIntermedio().getButton(i,j).setBackground(ventanaPartida.getBotonera().pasala());
				 		 x = ventanaPartida.getBotonera().numero();
				 		 ArrayIntermedio[j] = x;
				   } 
				 }
		 }
		else if(nivel.equals("Avanzado")){
			for (int i = 0; i < 14; i++)
			 	for (int j = 0; j<6; j++)
				{
			   if((e.getActionCommand().equals((ventanaPartida.getPnlAvanzado().getButton(i,j).getActionCommand())))){
			 		ventanaPartida.getPnlAvanzado().getButton(i,j).setBackground(ventanaPartida.getBotonera().pasala());
			 		 x = ventanaPartida.getBotonera().numero();
			 		 ArrayAvanzado[j] = x;
			   } 
			 }	
		}
		
		if(e.getActionCommand().equals("Comprobar") && cargada()){
			intentos++;
			vectorDB.clear(); 
			vectorDI.clear(); 
			vectorDA.clear();
	       
			if(nivel.equals("Basico")){
				for (int a= 0; a<4;a++)
				{
					System.out.println( ArrayBasico[a]);
				     int r =  ArrayBasico[a];     
				     vectorDB.add(a,r);
				     System.out.println( ArrayBasico[a]+ "olucion");	
				     
				       
				}
			
				for (int y = 0; y < 4; y++)
					 ArrayBasico[y] = -1;  
				     System.out.println(vectorDB + "solucion");
			      
				}
				if(nivel.equals("Intermedio")){
					for (int a= 0; a<5;a++)
					{
						System.out.println( ArrayIntermedio[a]);
					    int  p =  ArrayIntermedio[a];               
					
					    
					}
					
					for (int t = 0; t < 5; t++)
						 ArrayIntermedio[t] = -1;
		   
					System.out.println(vectorDI + "solucion");
				     
					}
				if(nivel.equals("Avanzado")){
					for (int a= 0; a<6;a++)
					{
						System.out.println( ArrayAvanzado[a]);
					    int b = ArrayAvanzado[a];  
					    vectorDA.add(a,b);
						         
	                     }
					
					for (int q = 0; q < 6; q++)
						 ArrayAvanzado[q] = -1;  
					System.out.println(vectorDA + "solucion");
				     
				      	
				   }
			
				
			Contar();
			 
			int negrasAqui= negras;
			int blancasAqui=blancas;
			if(ventanaPartida.getValorBasico()==true)
			{
				cantidad=12;
				alturaTipo=38;
				anchoTipo=320;
			}
			else if(ventanaPartida.getValorIntermedio()==true)
			{
				cantidad=13;
				alturaTipo=38;
				anchoTipo=350;
				
			}
			else if(ventanaPartida.getValorAvanzado()==true)
			{
				cantidad=14;
				alturaTipo=38;
				anchoTipo=385;
			}
			
			if(jugadas<cantidad)
			{
				jugadas++;
			
				int total=0;
				JButton boton []= new JButton[blancasAqui+negrasAqui];
				if((negrasAqui!=0) || blancasAqui!=0){
				total=negrasAqui+blancasAqui;
				{
					 
				 for(int i=0;i<total;i++)
				 {
				    if(blancasAqui>0)
					{
				    	System.out.println("blancas");
						boton[i]= new JButton();
						boton[i].setVisible(true);
						boton[i].setBackground(Color.WHITE);
						boton[i].setEnabled(false);
				    	boton[i].setBounds(anchoTipo, altura, 19, 17);
				    	pnlImagenPartida.add(boton[i],null);    	
				    	boton[i].revalidate();
				    	boton[i].repaint();
				    	anchoTipo=anchoTipo+19;
				    	blancasAqui--;
					}
				    if (negrasAqui >0)
					{
				    	System.out.println("negras");
						boton[i]= new JButton();
						boton[i].setVisible(true);
						boton[i].setEnabled(false);
				    	boton[i].setBackground(Color.black);
				    	boton[i].setBounds(anchoTipo, altura, 19, 17);
				    	pnlImagenPartida.add(boton[i],null);
				    	boton[i].revalidate();
				    	boton[i].repaint();
				    	anchoTipo=anchoTipo+19;
				    	negrasAqui--;
					}
				    if ((negrasAqui==0) && (blancasAqui==0)){
				    	boton[i]= new JButton();
						boton[i].setVisible(true);
						boton[i].setEnabled(false);
				    	boton[i].setBackground(Color.gray);
				    	boton[i].setBounds(anchoTipo, altura, 19, 17);
				    	pnlImagenPartida.add(boton[i],null);
				    	boton[i].revalidate();
				    	boton[i].repaint();
				    	anchoTipo=anchoTipo+19;
				    }
				   }
				}
				 
				altura=altura+alturaTipo;
				}		
			if((nivel.equals("Basico") && intentos == 12) ||
				(nivel.equals("Intermedio") && intentos == 13) ||
				(nivel.equals("Avanzado") && intentos == 14) ){
				fin = true;
				//ganador = Verificar();
			}else{
				//fin = Verificar();
				ganador = fin;
			}
			//fin = true;
			ganador = true;
			if(fin){
				MostrarMensaje(ganador, intentos);
			}
			else{
				HabilitarSiguiente();
				
				
			}
		}
		else if(e.getActionCommand().equals("Nivel Basico")){
			nivel1 = "Basico";
			new ControladorConsulta(nivel1);
		}
		else if(e.getActionCommand().equals("Nivel Intermedio")){
			nivel1 = "Intermedio";
			new ControladorConsulta(nivel);
		}
		else if(e.getActionCommand().equals("Nivel Avanzado")){
			nivel1 = "Avanzado";
			new ControladorConsulta(nivel);
		}
		}
		
	}
	
	public boolean cargada(){
		if(nivel.equals("Basico"))
		{	
			System.out.println("sda1"); 
			for (int a= 0; a<4;a++)
			{
			   int q = ArrayBasico[a];
			    if(q==-1)
			    {
			        ventanaPartida.getComprovar(false); 
			    	return false;
			        
			    }
			}	
		}
		else if(nivel.equals("Intermedio")){
			for (int a= 0; a<4;a++)
			{
			   int q = ArrayIntermedio[a];
			    if(q==-1)
			    	{
			    	ventanaPartida.getComprovar(false); 
			    	return false;
			    	
			    	}
			}

		}
		else if(nivel.equals("Avanzado")){
			
			for (int a= 0; a<6;a++)
			{
			   int q = ArrayAvanzado[a];
			    if(q==-1){
			   ventanaPartida.getComprovar(false); 
			   return false;
			    }
			 
			}  
			
		}
		

          return true;
      
	}
	private void MostrarMensaje(boolean ganador, int intentos){
		if(!ganador){
			ventanaPartida.CrearMensajePerdedor();
			new ControladorBienvenida();
			ventanaPartida.setVisible(false);
		}
		else{
			CalcularPuntaje(intentos);
			ventanaPartida.CrearMensajeGanador(puntosGanados);
			GuardarPartida();
			new ControladorBienvenida();
			ventanaPartida.setVisible(false);
		}
	}

	private void GuardarPartida(){
		PartidaRecordDAO partidaRecordDAO = new PartidaRecordDAO();
		minutos = ventanaPartida.getjLabelCronometro1().TotalEnMinutos();
		PartidaRecord partidaRecord = new PartidaRecord(nivel, jugador, puntosGanados, intentos, minutos);
		partidaRecordDAO.registrarPartidaRecord(partidaRecord);
	}
	
	
	private void CalcularPuntaje(int intentos){
		double puntaje = 0;
		minutos = ventanaPartida.getjLabelCronometro1().TotalEnMinutos();
		puntaje = (intentos / minutos) * 1500;
		puntosGanados = (int)puntaje;
	}
	
	private void HabilitarSiguiente(){

		if(nivel.equals("Basico")){
			ventanaPartida.BotonesVisibles(true,intentos,NIVEL_BASICO, nivel);
			ventanaPartida.BloquearBotones(false, intentos,NIVEL_BASICO, nivel);
		}
		else if(nivel.equals("Intermedio")){
			ventanaPartida.BotonesVisibles(true,intentos,NIVEL_INTERMEDIO, nivel);
			ventanaPartida.BloquearBotones(false, intentos,NIVEL_INTERMEDIO, nivel);
		}
		else if(nivel.equals("Avanzado")){
			ventanaPartida.BotonesVisibles(true,intentos,NIVEL_AVANZADO, nivel);
			ventanaPartida.BloquearBotones(false, intentos,NIVEL_AVANZADO, nivel);
		}
	}
	
	private Vector<Integer> GenerarCodigoSecreto(){
		
		Random rnd = new Random();
		rnd.setSeed(new Date().getTime());
		
		if(nivel.equals("Basico")){

		Vector<Integer> vectorB = new Vector<Integer>(3);
		
	    		for (int i = 0; i < 4; i++){
	    			int a = (int) (Math.random() * 3);
	    			vectorB.add(a);
	    		}
	    		return vectorB;
			}
	    
		else if(nivel.equals("Intermedio")){
	    	
	    	Vector<Integer> vectorI = new Vector<Integer> (4);
	    	
	    		for(int i = 0; i < 4; i++){
	    			int b = (int) (Math.random() * 4);
	    			vectorI.add(b);
	    		}
	    		return vectorI;
	    			
	    	}
		
	    else if(nivel.equals("Avanzado")){
	    	
	    	Vector<Integer> vectorA = new Vector<Integer> (5);
	    
	    		for(int i = 0; i < 6; i++){
	    			int c = (int) (Math.random() * 5);
	                vectorA.add(c);
	    		}
	    		return vectorA;
	
	    	}
		return null;

		}
	
 public void Contar(){
		
		h=0;
		negras=0;
		blancas=0;
		coincidencias=0;
		
		
		if(nivel.equals("Basico")){
			codigoDado = vectorDB;
			
		}
		else if(nivel.equals("Intermedio")){
			  codigoDado = vectorDI;
			
		}
		else if(nivel.equals("Avanzado")){
			  
			codigoDado = vectorDA;	
		  }
		
		
		
		System.out.println(codigoSolucion+"ppp");
		
		for(i=0; i < codigoSolucion.size();i++){
			System.out.println(codigoSolucion.size());
			System.out.println(codigoDado.size());
			System.out.println(codigoSolucion.elementAt(i));
			System.out.println(codigoDado.elementAt(h));
			
			if (codigoSolucion.elementAt(i)==codigoDado.elementAt(h)){
				negras++;
				h++;
				
			}
		    else
		    	h++;
		    }
		
		for(i=0; i<codigoSolucion.size();i++){
			for(h=0;h<codigoDado.size();h++){
				if(codigoSolucion.elementAt(i)==codigoDado.elementAt(h)){
					coincidencias++;
					codigoDado.removeElementAt(h);
					break;
				}
			}
		}
		blancas=coincidencias-negras;
		System.out.println("negras"+negras);
		System.out.println("blancas"+blancas);
	    }
}
